package org.soft.xinyu.equipmentmanagement.result;

import lombok.Data;

import java.io.Serializable;

/**
 * Created with IntelliJ IDEA.
 *
 * @Author: xinyu
 * @Date: 2022/01/08/15:06
 * @Description:
 */
@Data
public class Result<T> implements Serializable {

    /**
     * 状态码
     */
    private int code;

    /**
     * 提示消息
     */
    private String msg;

    /**
     * 返回数据
     */
    private T data;

    /**
     * 返回数据集元素的个数
     */
    private Integer total;

    /**
     * 成功操作，携带默认信息
     */
    public static <T> Result<T> success() {
        return success(ResultCode.SUCCESS.getMessage());
    }

    /**
     * 成功操作, 携带成功状态码、自定义消息、数据和数据集中元素个数
     */
    public static <T> Result<T> success(String message, T data, Integer total) {
        return success(ResultCode.SUCCESS.getCode(), message, data, total);
    }

    /**
     * 成功操作, 携带成功状态码、自定义消息、数据
     */
    public static <T> Result<T> success(String message, T data) {
        return success(ResultCode.SUCCESS.getCode(), message, data, null);
    }

    /**
     * 成功操作, 携带成功状态码、自定义消息
     */
    public static <T> Result<T> success(String message) {
        return success(message, null);
    }

    /**
     * 成功操作, 携带成功状态码、默认消息、数据
     */
    public static <T> Result<T> success(T data) {
        return success(ResultCode.SUCCESS.getMessage(), data);
    }

    /**
     * 成功操作, 携带自定义成功状态码、自定义消息和数据
     */
    public static <T> Result<T> success(int code, String message) {
        return success(code, message, null, null);
    }

    /**
     * 成功操作, 携带自定义状态码、消息、数据和数据集中元素个数
     */
    public static <T> Result<T> success(int code, String message, T data, Integer total) {
        Result<T> result = new Result<T>();
        result.setCode(code);
        result.setMsg(message);
        result.setData(data);
        result.setTotal(total);
        return result;
    }

    /**
     * 失败操作, 携带默认数据
     */
    public static <T> Result<T> fail() {
        return fail(ResultCode.FAILURE.getMessage());
    }

    /**
     * 失败操作, 携带失败状态码、自定义消息
     */
    public static <T> Result<T> fail(String message) {
        return fail(message, null);
    }

    /**
     * 失败操作, 携带失败状态码、自定义消息、数据
     */
    public static <T> Result<T> fail(String message, T data) {
        return fail(ResultCode.FAILURE.getCode(), message, data);
    }

    /**
     * 失败操作, 携带自定义状态码、自定义消息
     */
    public static <T> Result<T> fail(int code, String message) {
        return fail(code, message, null);
    }

    /**
     * 失败操作, 携带自定义状态码、消息、数据
     */
    public static <T> Result<T> fail(int code, String message, T data) {
        Result<T> result = new Result<T>();
        result.setCode(code);
        result.setMsg(message);
        result.setData(data);
        return result;
    }
}


